package com.crm.dao.mapper.customMapper.orderManagerCustomMapper;

import com.crm.model.entity.finishOrderProduct.FinishOrderProduct;
import com.crm.model.entity.orderManager.CustomerProductOrder;
import com.crm.model.qo.memberManager.MonthDealCustomerQO;
import com.crm.model.qo.orderManager.CustomerProductOrderQO;
import com.crm.model.qo.orderManager.ExportOrderProductQO;
import com.crm.model.qo.orderManager.FinanceProductOrderQO;
import com.crm.model.vo.customerManager.BalanceBackMoneyVO;
import com.crm.model.vo.customerManager.NewSingleMemberStatisticsVO;
import com.crm.model.vo.datasearch.DataSearchResultVO;
import com.crm.model.vo.orderManager.*;
import com.crm.model.vo.productManager.ProductNamesVo;
import com.crm.model.vo.returnMoney.FinanceProductOderInfoVO;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
import java.util.List;

/**
 * @ Author ：pym
 * @ Date   ：2021/3/12 10:42
 */
public interface CustomerProductOrderCustomMapper {
    /**
     * 订单管理-订单列表
     *
     * @param customerProductOrderQO -查询条件
     * @param dateUnit               -日期类型(全部/本周/本月/本年度)
     * @param accountId              -账号Id
     * @param companyId              -所属分公司Id
     * @return {@link {java.util.List<com.crm.model.vo.orderManager.CustomerProductOrderVO>}}
     * @Author pym
     * @Date 2021/3/12 11:19
     */
    List<CustomerProductOrderVO> selectAllCustomerProductOrderList(@Param("customerProductOrderQO") CustomerProductOrderQO customerProductOrderQO,
                                                                   @Param("dateUnit") Integer dateUnit, @Param("order") String order,
                                                                   @Param("accountId") String accountId, @Param("companyId") String companyId);


    /**
     * 订单详情基本信息
     *
     * @param productOrderId
     * @return {@link {com.crm.model.vo.orderManager.OrderDetailVO}}
     * @Author pym
     * @Date 2021/3/17 11:07
     */
    OrderDetailVO selectOrderDetailVO(@Param("productOrderId") String productOrderId);


    /**
     * 财务-订单列表
     *
     * @param financeProductOrderQO
     * @param dateUnit
     * @param order
     * @param companyId
     * @return
     */
    List<FinanceProductOrderVO> selectFinanceOrderVOList(@Param("qo") FinanceProductOrderQO financeProductOrderQO,
                                                         @Param("dateUnit") Integer dateUnit,
                                                         @Param("order") String order,
                                                         @Param("companyId") String companyId);

    /**
     * 财务-订单详情
     *
     * @param productOrderId
     * @return
     */
    FinanceProductOderInfoVO getFinanceProductOderInfo(@Param("productOrderId") String productOrderId, @Param("status") Integer status, @Param("type") Integer type);

    CustomerProductOrderVO getOrderInfoById(@Param("orderId") String orderId);

    /**
     * 回款、修改订单表
     *
     * @param order
     * @return
     */
    void updateOrderComplete(CustomerProductOrderVO order);

    /**
     * 获取完成的订单的产品
     *
     * @param orderId
     * @return
     */
    List<FinishOrderProduct> getFinishProductList(@Param("orderId") String orderId);

    /**
     * 申请开票页面订单详情
     *
     * @param type
     * @param orderId
     * @return
     */
    ApplyInvoiceOrderInfoVO getApplyInvoiceOrderInfo(@Param("type") String type, @Param("orderId") String orderId);

    /**
     * 会员非会员总额度统计
     *
     * @param yeahMonth
     * @param memberTag
     * @param accountId
     * @return
     */
    BigDecimal selectAnnualAmountByOneMonth(@Param("yeahMonth") String yeahMonth, @Param("memberTag") String memberTag, @Param("accountId") String accountId);

    /**
     * 统计会员消费占比
     *
     * @param year 年份
     * @return
     */
    List<Integer> getAnalyseVipBuyRatio(@Param("year") Integer year, @Param("companyId") String companyId);

    /**
     * 会员复购率
     *
     * @param year      年份
     * @param companyId
     * @return
     */
    List<Integer> getAnalyseVipAgainBuyRatio(@Param("year") Integer year, @Param("companyId") String companyId);

    /**
     * 会员交易增长率
     *
     * @param year
     * @param companyId
     * @return
     */
    List<BigDecimal> getAnalyseVipBuyRiseRatio(@Param("year") Integer year, @Param("companyId") String companyId);

    /***
     * @Description: 查询公司本月金额统计
     * @Param: companyId 公司id
     * @Author: luojie
     * @Date: 2021/4/27 22:58
     */
    BigDecimal selectThisMonthCompanyPerformance(@Param("companyId") String companyId, @Param("thisMonth") String thisMonth);

    /***
     * @Description:查询个人本月金额统计
     * @Param: accountId 账号id
     * @Author: luojie
     * @Date: 2021/4/27 22:59
     */
    BigDecimal selectThisMonthPersonalPerformance(@Param("accountId") String accountId, @Param("thisMonth") String thisMonth);

    /***
     * @Description:查询业绩排名
     * @Author: luojie
     * @Date: 2021/4/29 9:23
     */
    List<PerformanceRankVO> selectPerformanceRank(@Param("companyId") String companyId);

    /***
     * @Description:查询个人本月业绩统计
     * @Param: companyId 公司id
     * @Param: accountId 账号id
     * @Param: thisMonth 本月
     * @Author: luojie
     * @Date: 2021/4/29 11:30
     */
    int personalThisMonthPerformanceRank(@Param("companyId") String companyId, @Param("accountId") String accountId, @Param("thisMonth") String thisMonth);

    /**
     * 根据账号和是否生效状态查询合同
     *
     * @param orderStatus 合同状态
     * @param dateUnit    contractStatus:1未生效；3:已结束（生效）；4:已作废
     * @param accountId   账号id
     * @return
     * @Author: luojie
     */
    BigDecimal selectContractAmount(@Param("orderStatus") String orderStatus, @Param("dateUnit") Integer dateUnit, @Param("accountId") String accountId);

    /**
     * 根据账号和是否生效状态查询合同数量
     *
     * @param orderStatus 合同状态
     * @param dateUnit    contractStatus:1未生效；3:已结束（生效）；4:已作废
     * @param accountId   账号id
     * @return
     * @Author: luojie
     */
    long selectContractCount(@Param("orderStatus") String orderStatus, @Param("dateUnit") Integer dateUnit, @Param("accountId") String accountId);

    /***
     * @Description:查询合同退款数
     * @Param: dateUnit  ---全部、本周、本月查询条件
     * @Param: accountId 账号id
     * @Author: luojie
     * @Date: 2021/5/6 10:24
     */
    long selectContractRefundCount(@Param("dateUnit") Integer dateUnit, @Param("accountId") String accountId);


    /**
     * @Description: 通过订单编号获取数据
     * @Param: [orderNum]
     * @Return: java.util.List<com.crm.model.vo.datasearch.DataSearchResultVO>
     * @Author: lixq-f
     * @Date: 2021/5/13
     **/
    List<DataSearchResultVO> selectDataByOrderNum(String orderNum);

    /**
     * 通过订单编号查询订单信息
     *
     * @param orderNumber
     * @return
     */
    CustomerProductOrderVO getOrderInfoByNumber(@Param("orderNumber") String orderNumber);

    /***
     * @Description:
     * @Param:
     * @Author: luojie
     * @Date: 2021/5/25 16:24
     */
    long selectDealCustomersNumber(@Param("companyId") String companyId, @Param("yearMonth") String yearMonth);

    /***
     * @Description:单品客户会员统计
     * @Param: 年月
     * @Author: luojie
     * @Date: 2021/5/26 14:23
     */
    List<NewSingleMemberStatisticsVO> selectNewSingleMemberStatistics(@Param("yearMonth") String yearMonth, @Param("companyId") String companyId);

    /***
     * @Description:会员统计
     * @Param: 年月
     * @Author: luojie
     * @Date: 2021/5/26 14:23
     */
    List<NewSingleMemberStatisticsVO> selectNewSingleMemberStatisticsByContract(@Param("yearMonth") String yearMonth, @Param("companyId") String companyId, @Param("contractType") String contractType);
    /***
     * @Description:会员统计
     * @Param: 年月
     * @Author: luojie
     * @Date: 2021/5/26 14:23
     */
    List<ProductNamesVo> selectProductNameByOrderId(@Param("orderIds") List<String> ids);

    /***
     * @Description:查询本月新增会员、续费会员、非会员额度
     * @Param: yearMonth 本月年月
     * @Param: contractType 合同类型
     * @Author: luojie
     * @Date: 2021/5/26 16:23
     */
    long selectThisMonthPercentageQuotaStatistics(@Param("yearMonth") String yearMonth, @Param("companyId") String companyId, @Param("contractType") String contractType);

    /**
     * 根据订单编号查询
     *
     * @param orderNumber
     * @return
     */
    CustomerProductOrderVO selectOrderByNumber(@Param("orderNumber") String orderNumber);

    /**
     * 根据月份查询公司的交易额
     *
     * @param companyId
     * @param thisMonth
     * @return
     */
    BigDecimal selectThisMonthBigByCompanyId(@Param("companyId") String companyId, @Param("month") String thisMonth);

    /**
     * 查询会员总数
     *
     * @param companyId
     * @return
     */
    Integer selectCustomerCount(@Param("companyId") String companyId);

    /**
     * 当月客户消费额度
     *
     * @param month
     * @param companyId
     * @return
     */
    BigDecimal getThisMonthCustomerConsumeCount(@Param("month") String month, @Param("companyId") String companyId);

    /**
     * 当月会员客户消费额度
     *
     * @param month
     * @param companyId
     * @return
     */
    BigDecimal getThisMonthVipCustomerConsumeCount(@Param("month") String month, @Param("companyId") String companyId);

    /**
     * 当月续费会员数量
     *
     * @param month
     * @param companyId
     * @return
     */
    Integer selectThisMonthRenewVip(@Param("month") String month, @Param("companyId") String companyId);

    /**
     * 查询需要补发产品的订单
     *
     * @return
     */
    List<String> selectAnewSendFinishOrderId();

    /**
     * 查询没有计算业绩金额的产品
     *
     * @return
     */
    List<FinishOrderProduct> getFinishProductRoyaltyIsNullList();

    /**
     * 获取产品名称表头
     *
     * @param type                 类型 memberNew：会员新建订单；membershipRenewal：会员续费订单；course：课程订单；
     * @param exportOrderProductQO 筛选条件
     * @param companyId            公司id
     * @return {@link {java.util.List<java.lang.String>}}
     * @Author pym
     * @Date 2021/8/13 10:40
     */
    List<String> getProductNameList(@Param("type") String type, @Param("exportOrderProductQO") ExportOrderProductQO exportOrderProductQO,
                                    @Param("companyId") String companyId);

    /**
     * 获取产品名称和价格
     *
     * @param type                 类型 memberNew：会员新建订单；membershipRenewal：会员续费订单；course：课程订单；
     * @param exportOrderProductQO 筛选条件
     * @param companyId            公司id
     * @return {@link {java.util.List<com.crm.model.vo.orderManager.OrderProductPriceVO>}}
     * @Author pym
     * @Date 2021/8/13 10:41
     */
    List<OrderProductPriceVO> getProductNameAndPriceList(@Param("type") String type, @Param("exportOrderProductQO") ExportOrderProductQO exportOrderProductQO,
                                                         @Param("companyId") String companyId);

    /**
     * 获取退款产品名称表头
     *
     * @param exportOrderProductQO 筛选条件
     * @param companyId            公司id
     * @return {@link {java.util.List<java.lang.String>}}
     * @Author pym
     * @Date 2021/8/13 10:41
     */
    List<String> getRefundProductNameList(@Param("exportOrderProductQO") ExportOrderProductQO exportOrderProductQO,
                                          @Param("companyId") String companyId);

    /**
     * 获取退款产品名称和价格
     *
     * @param exportOrderProductQO 筛选条件
     * @param companyId            公司id
     * @return {@link {java.util.List<com.crm.model.vo.orderManager.OrderProductPriceVO>}}
     * @Author pym
     * @Date 2021/8/13 10:41
     */
    List<OrderProductPriceVO> getRefundProductNameAndPriceList(@Param("exportOrderProductQO") ExportOrderProductQO exportOrderProductQO,
                                                               @Param("companyId") String companyId);

    /**
     * 财务首页订单数量统计
     *
     * @param companyId
     * @return
     */
    FinanceIndexOrderInfoVO financeIndexOrderInfo(@Param("companyId") String companyId);

    /**
     * 查询各订单类型的回款金额
     *
     * @param companyId
     * @param dateUnit
     * @return
     */
    List<BigDecimal> selectOrderTypeReturnMoney(@Param("companyId") String companyId,
                                                @Param("dateUnit") Integer dateUnit,
                                                @Param("type") Integer type);

    /**
     * 退款详情-订单详情
     *
     * @param orderBackMoneyId 退款id
     * @return
     */
    OrderDetailVO selectBackOrderDetail(@Param("orderBackMoneyId") String orderBackMoneyId);

    List<CustomerProductOrderVO> selectCustomerAllOrder(@Param("orderStatus") String orderStatus);

    /**
     * 余额退款详情
     *
     * @param orderBackMoneyId 退款id
     * @return
     */
    BalanceBackMoneyVO selectBalanceBackMoneyDetail(@Param("orderBackMoneyId") String orderBackMoneyId);


    /**
     * 批量补充订单表客户信息(临时用补充正式库数据:customer_id;customer_name为空的)
     *
     * @param customerProductOrderList
     * @return
     * @author yincuimei
     * @Date(2021-9-26)
     */
    int batchUpdateCustomerProductOrderByIds(@Param("customerProductOrderList") List<CustomerProductOrder> customerProductOrderList);

    /**
     * 通过订单id和产品号查询退款金额累加
     *
     * @param productOrderId        订单id
     * @param finishOrderProductNum 产品号
     * @return
     */
    BigDecimal sumBackMoney(@Param("productOrderId") String productOrderId, @Param("finishOrderProductNum") String finishOrderProductNum);

    List<MonthDealCustomerQO> getEveryMonthDealCustomersNumber(@Param("companyId") String companyId, @Param("startDate") String startDate, @Param("endDate") String endDate);

    /**
     * 根据订单id修改订单状态
     * @Param customerProductOrder
     * @Author xielinqi
     * @Date 3:16 下午 2021/11/8
     */
    Boolean updateOrderSelective(CustomerProductOrder customerProductOrder);

    List<CustomerProductOrderVO> selectCustomerProductOrder(@Param("customerProductOrderQO") CustomerProductOrderQO customerProductOrderQO,
                                                            @Param("order") String order);

    /**
     * @author  yuanyunfeng
     * @Description 预回款时修改订单
     * @date  2021/12/9 10:05
     * @Param [customerProductOrder]
     * @return boolean
     **/
    boolean updateOrderCustom(CustomerProductOrder customerProductOrder);
}
